package xyz.zhno.mall.product.web.controller;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.AllArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import xyz.zhno.mall.common.mpg.entity.PmsProductCategory;
import xyz.zhno.mall.common.mpg.vo.BasePage;
import xyz.zhno.mall.common.mpg.query.BaseQuery;
import xyz.zhno.mall.product.model.dto.PmsProductCategoryNodeDTO;
import xyz.zhno.mall.product.model.param.PmsProductCategoryParam;
import xyz.zhno.mall.product.web.service.PmsProductCategoryService;

import javax.validation.constraints.NotNull;
import java.util.List;

/**
 * 商品分类表现层
 * @author zh_o
 */
@RestController
@AllArgsConstructor
@RequestMapping("/category")
public class PmsProductCategoryController {

    private final PmsProductCategoryService productCategoryService;

    /**
     * 根据ID查询商品分类信息
     * @param id 商品分类ID
     * @return 商品分类信息
     */
    @GetMapping("/get")
    public PmsProductCategory get(@Validated @NotNull(message = "分类ID不能为空") Long id) {
        return productCategoryService.getById(id);
    }

    /**
     * 商品分类列表分页查询
     * @param query 查询条件
     * @return 分页后商品分类数据
     */
    @GetMapping("/list")
    public BasePage<PmsProductCategory> list(@Validated BaseQuery query) {
        return BasePage.newBasePage(
                productCategoryService.page(new Page<>(query.getPageNum(), query.getPageSize()),
                        new LambdaQueryWrapper<PmsProductCategory>().orderByDesc(PmsProductCategory::getSort))
        );
    }

    /**
     * 新增分类
     * @param param 分类参数对象
     * @return 新增分类ID
     */
    @PostMapping("/add")
    public Long create(@Validated PmsProductCategoryParam param) {
        return productCategoryService.create(param);
    }

    /**
     * 修改分类
     * @param id 需要修改分类的ID
     * @param param 分类参数对象
     * @return 修改分类的ID
     */
    @PutMapping("/update")
    public Long update(@Validated @NotNull(message = "分类ID不能为空") Long id, @Validated PmsProductCategoryParam param) {
        return productCategoryService.update(id, param);
    }

    /**
     * 删除分类
     * @param id 需要删除分类的ID
     * @return 删除分类的ID
     */
    @DeleteMapping("/delete")
    public Long delete(@Validated @NotNull(message = "分类ID不能为空") Long id) {
        productCategoryService.removeById(id);
        return id;
    }

    /**
     * 以树形结构获取所有商品分类
     * @return 商品分类树形列表
     */
    @GetMapping("tree")
    public List<PmsProductCategoryNodeDTO> tree() {
        return productCategoryService.tree();
    }

}

